home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2000 Spring / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin / MIPSSIM / mem.c < prev    next >
C/C++ Source or Header  |  1999-12-02  |  3KB  |  162 lines

  1. #include <stdio.h>
  2. #include "define.h"
  3. /*
  4.   Memory Module
  5. */
  6. static char mem[MAXPAGENUM][0x10000];
  7. static ulong pair[MAXPAGENUM];
  8. static int pair_ptr= -1;
  9.  
  10. static int search(ulong addr)
  11. {
  12.   int i;
  13.  
  14.   if(pair_ptr<0){ /* init */
  15.     pair_ptr = 0;
  16.     pair[pair_ptr] = addr&0xffff0000L;
  17.     return pair_ptr;
  18.   }
  19.   for(i=0;i<=pair_ptr;i++){
  20.     if(((pair[i]^addr)&0xffff0000L)==0)
  21.       break;
  22.   }
  23.   if(i<=pair_ptr){ /* match */
  24.     return i;
  25.   }
  26.   if((pair_ptr+1)<MAXPAGENUM){ /* allocate */
  27.     pair_ptr++;
  28.     pair[pair_ptr] = addr&0xffff0000L;
  29.     return pair_ptr;
  30.   }
  31.   printf("mem.c:out of memory at 0x%08x\n",addr);
  32.   return -1;
  33. }
  34.  
  35. ulong get_pword(ulong addr)
  36. {
  37.   int i;
  38.   int c0,c1,c2,c3;
  39.  
  40.   addr &= 0xfffffffcL;
  41.   i = search(addr);
  42.   if(i>=0){
  43.     addr &= 0xffff;
  44.     c0 = mem[i][addr+0]&0xff;
  45.     c1 = mem[i][addr+1]&0xff;
  46.     c2 = mem[i][addr+2]&0xff;
  47.     c3 = mem[i][addr+3]&0xff;
  48.     return (c3<<24)|(c2<<16)|(c1<<8)|(c0);
  49.   }
  50.   return 0;
  51. }
  52.  
  53. void put_pword(ulong addr, ulong data)
  54. {
  55.   int i;
  56.   int c0,c1,c2,c3;
  57.  
  58.   addr &= 0xfffffffcL;
  59.   i = search(addr);
  60.   if(i>=0){
  61.     addr &= 0xffff;
  62.     c0 = (data    )&0xff;
  63.     c1 = (data>> 8)&0xff;
  64.     c2 = (data>>16)&0xff;
  65.     c3 = (data>>24)&0xff;
  66.     mem[i][addr+0] = c0;
  67.     mem[i][addr+1] = c1;
  68.     mem[i][addr+2] = c2;
  69.     mem[i][addr+3] = c3;
  70.   }
  71. }
  72.  
  73. ulong get_word(ulong addr)
  74. {
  75.   return get_pword(addr&0x1ffffffcL);
  76. }
  77.  
  78. void put_word(ulong addr, ulong data)
  79. {
  80.   put_pword(addr&0x1ffffffcL, data);
  81. }
  82.  
  83. void mem_dump(ulong start, ulong end, int unit)
  84. {
  85.   ulong  m_start;
  86.   ulong  m_end;
  87.   ulong  a,c;
  88.   int    width,ainc;
  89.   int    data;
  90.   unsigned char   asc[16];
  91.   unsigned char   d0,d1,d2,d3;
  92.  
  93.   if(unit==0){
  94.     width=16;
  95.     ainc =1;
  96.   }
  97.   else if(unit==1){
  98.     width=8;
  99.     ainc =2;
  100.   }
  101.   else {
  102.     unit =2;
  103.     width=4;
  104.     ainc =4;
  105.   }
  106.   m_start = start&0xfffffffcL;
  107.   m_end   = end  &0xfffffffcL;
  108.   for(a=m_start,c=0;a<m_end;a += 4){
  109.     if(c==0) printf("%08x: ",a);
  110.     data=get_pword(a);
  111.     asc[4*c+0]=d0=data&0xff;
  112.     asc[4*c+1]=d1=(data>>8)&0xff;
  113.     asc[4*c+2]=d2=(data>>16)&0xff;
  114.     asc[4*c+3]=d3=(data>>24)&0xff;
  115.     switch(unit){
  116.     case 0:
  117.       printf("%02x %02x %02x %02x  ",d0,d1,d2,d3);
  118.       break;
  119.     case 1:
  120.       printf("%04x %04x ",(d1<<8)|d0,(d3<<8)|d2);
  121.       break;
  122.     case 2:
  123.       printf("%08x ",data);
  124.       break;
  125.     }
  126.     asc[4*c+0]=((d0>=' ')&&(d0<='~')) ? d0 : '.';
  127.     asc[4*c+1]=((d1>=' ')&&(d1<='~')) ? d1 : '.';
  128.     asc[4*c+2]=((d2>=' ')&&(d2<='~')) ? d2 : '.';
  129.     asc[4*c+3]=((d3>=' ')&&(d3<='~')) ? d3 : '.';
  130.     c++;
  131.     if(c==4){
  132.       int     i;
  133.       c=0;
  134.       for(i=0;i<16;i++) printf("%c",asc[i]);
  135.       printf("\n");
  136.     }
  137.   }
  138.   if(c!=0){
  139.     int i;
  140.     while(c<4){
  141.       switch(unit){
  142.       case 0:
  143.     printf("            ",d0,d1,d2,d3);
  144.     break;
  145.       case 1:
  146.     printf("          ",(d1<<8)|d0,(d3<<8)|d2);
  147.     break;
  148.       case 2:
  149.     printf("         ",data);
  150.     break;
  151.       }
  152.       asc[4*c+0]=' ';
  153.       asc[4*c+1]=' ';
  154.       asc[4*c+2]=' ';
  155.       asc[4*c+3]=' ';
  156.       c++;
  157.     }
  158.     for(i=0;i<16;i++) printf("%c",asc[i]);
  159.     printf("\n");
  160.   }
  161. }
  162.